/**
  * Author: Mei
  * Date: 2020-12-13 15:11
  * Description: set和multiset
  */
#include "../../head.h"

using namespace std;

int main() {
    /**
     * set和multiset以rb_tree为底层结构，因此有自动排序的特性，排序的依据是key
     * 可以使用iterator遍历，但我们无法使用使用iterator改变元素值(因为key有其谨慎的
     * 排序规则).set/multiset的iterator是其底部的RBtree的const_iterator,就是为了禁止对元素赋值
     *
     * set元素的key必须独一无二，因此其insert()调用的是insert_unique();
     * multiset元素的key必须独一无二，因此其insert()调用的是insert_equal();
     *
     */

    set<int> se{1, 5, 3, 4, 6, 1};
    set<int>::const_iterator it = --(se.end()); //不允许通过iterator赋值
    cout << se.size() << endl;
    cout << *it << endl;
    se.insert(20); //insert_unique(std::move(__x));

    multiset<int> ss{1, 2, 3, 5, 1};
    set<int>::const_iterator it1 = --(ss.end());
    cout << ss.size() << endl;
    cout << *it1 << endl;
    ss.insert(20); //_M_insert_equal(std::move(__x));
    cout << "---------------" << endl;
    set<int> se1{1, 5, 3, 4, 6, 1};
    cout << se1.count(1) << endl;
    set<int>::iterator iter = se1.find(5);
    cout << *iter << endl;
    pair<set<int>::iterator, bool> set_insert = se1.insert(7);
    if (set_insert.second == true) {
        cout << "successful!" << endl;
    } else {
        cout << "failure!" << endl;
    }
    se1.insert({1, 6, 4, 5});
    for(auto it : se1) {
        cout << it << endl;
    }

    unordered_map<int, string> uomap;

    return 0;
}